#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(){

  if(fork() == 0){
    execl("/usr/bin/ls","-l","-a","-n","-i",NULL);
    printf("\n");
  }

  waitpid(-1, NULL, 0);
  printf("wait success!\n");


 // printf("I am a process! pid:%d\n",getpid());
 // //只要进程的程序替换成功，就不会执行后续代码，意味着exec*函数成功的时候，不需要返回值检测！
 // //只要exec*返回了，就一定是因为调用失败了
 // execl("/usr/bin/lsssss","ls","-a","-l",NULL);
 // exit(1);
 // printf("hahahaha\n");
 // printf("hahahaha\n");
 // printf("hahahaha\n");

 // pid_t id = fork();
 // if(id == 0){
 //   printf("I am a process! pid:%d\n",getpid()); 
 //   sleep(5);

 //   execl("/usr/bin/ls","ls","-a","-l",NULL);//execl执行程序替换
 //   //execl("/usr/bin/top","top",NULL);

 //   printf("hahahaha\n");
 //   printf("hahahaha\n");
 //   printf("hahahaha\n");
 //   printf("hahahaha\n");
 //   printf("hahahaha\n");
 //   exit(0);
 // } 
 // while(1){
 //   printf("I am a father!\n");
 //   sleep(1);
 // }
 // waitpid(id,NULL,0);
 // printf("wait success!\n");
}





//int main(){ 
// // printf("I am a child process!, pid:%d, ppid:%d\n",getpid(),getppid()); 
// // exit(10);
//  pid_t id = fork();
//  if(id == 0){
//    int cnt = 10;
//    while(cnt--){
//      printf("child[%d] is running; cnt is : %d\n",getpid(),cnt);
//      sleep(1);
//    }
//    exit(1);
//  }
//
//  
//  int status = 0;
//  while(1){
//    pid_t ret = waitpid(id, &status, WNOHANG);
//    if(ret == 0){
//      //子进程没有退出，但是waitpid等待是成功的，需要父进程重复进行等待
//      printf("do father things!\n");
//    }
//    else if(ret > 0) {
//      //子进程退出了，waitpid也成功了，获取到了对应的结果
//      printf("father wait:%d, success, status exit code:%d, status exit signal:%d\n",ret,(status>>8)&0xFF,status&0x7F);
//      break;
//    }
//    else{
//      //等待失败
//      perror("waitid\n");
//      break;
//    }
//    sleep(1);
//  }
//
//
//
//
//
//
//
// // sleep(10);
// // printf("father wait begin\n");
// // //pid_t ret = wait(NULL);
// // //pid_t ret = waitpid(id, NULL, 0);    //等待指定一个进程
// //// pid_t ret = waitpid(-1, NULL, 0);    //等待任意一个子进程
// // 
// // int status = 0;
// // pid_t ret = waitpid(id, &status, 0/*0:默认行为，阻塞等待。WNOHANG:设置等待方式为非阻塞等待*/);
// // if(ret > 0){ //没有收到任何退出信号
// //   if(WIFEXITED(status)){
// //     //正常结束的，获取对用的退出码
// //     printf("exit code:%d\n",WEXITSTATUS(status));
// //   }
// //   else{
// //     printf("error, get a signal!\n");
// //   }
// // }
//
// // if(ret > 0){
// //   printf("father wait: %d. success, status exit code: %d.status exit signal:%d\n",ret, (status>>8)&0xFF,status&0x7F);
// // }
// // else{
// //   printf("father wait failed\n");
// // }
// 
//  //sleep(10);
//}



//int main(){
//  //for(int i =0; i< 134; i++){
//  //  printf("%d:%s\n",i,strerror(i));
//  //}
//  printf("hello world");
//  sleep(4);
//  _exit(12);
//  //exit(EXIT_SUCCESS);
//  //return 0;
//}
